package cn.hdu.liang.ch07;

import java.util.concurrent.*;

import static cn.hdu.liang.ch05.LaunderThrowable.launderThrowable;

/**
 * 通过Future来取消任务
 */
public class TimedRun {

    private static final ExecutorService taskExec = Executors.newCachedThreadPool();

    public static void timedRun(Runnable r, long timeout, TimeUnit unit) throws InterruptedException {

        Future<?> task = taskExec.submit(r);
        try {
            task.get(timeout, unit);
        } catch(TimeoutException e) {
            // task will be cancelled below
        } catch(ExecutionException e) {
            // exception thrown in task; rethrow
            throw launderThrowable(e.getCause());
        } finally {
            // Harmless if task already completed
            task.cancel(true); // interrupt if running
        }
    }
}
